import 'dart:io';
import 'dart:convert'; // 用于 UTF8 编码和解码
import 'dart:typed_data'; // 用于 Uint8List

Future<void> main() async {
  // 定义要操作的文件名
  final asyncFilename = 'async_example.txt';
  final syncFilename = 'sync_example.log';
  final binaryFilename = 'binary_example.bin';

  // --- 异步操作 (推荐) ---
  print('--- 异步文件操作 ---');
  final asyncFile = File(asyncFilename);

  // 1. 异步写入字符串 (覆盖模式, UTF8 编码)
  try {
    print('\n[异步] 准备写入字符串到 $asyncFilename (覆盖)...');
    final contentToWrite = 'Hello, 异步世界! \n这是第二行。\n文件编码是 UTF-8。';
    // FileMode.write (默认) 会覆盖文件或创建新文件
    await asyncFile.writeAsString(
      contentToWrite,
      encoding: utf8,
      mode: FileMode.write,
    );
    print('[异步] 字符串写入成功。');
  } catch (e) {
    print('[异步] 写入字符串时出错: $e');
  }

  // 2. 异步追加字符串
  try {
    print('\n[异步] 准备追加字符串到 $asyncFilename...');
    final contentToAppend = '\n这是追加的一行内容。';
    // FileMode.append 会在文件末尾追加，如果文件不存在则创建
    await asyncFile.writeAsString(
      contentToAppend,
      encoding: utf8,
      mode: FileMode.append,
    );
    print('[异步] 字符串追加成功。');
  } catch (e) {
    print('[异步] 追加字符串时出错: $e');
  }

  // 3. 异步读取整个文件为字符串
  try {
    if (await asyncFile.exists()) {
      print('\n[异步] 准备读取整个文件 $asyncFilename 为字符串...');
      final fileContent = await asyncFile.readAsString(encoding: utf8);
      print('[异步] 文件内容:\n"""\n$fileContent"""');
    } else {
      print('[异步] 文件 $asyncFilename 不存在，无法读取。');
    }
  } catch (e) {
    print('[异步] 读取字符串时出错: $e');
  }

  // 4. 异步按行读取文件
  try {
    if (await asyncFile.exists()) {
      print('\n[异步] 准备按行读取文件 $asyncFilename...');
      final lines = await asyncFile.readAsLines(encoding: utf8);
      print('[异步] 文件内容 (按行):');
      for (int i = 0; i < lines.length; i++) {
        print('  行 ${i + 1}: ${lines[i]}');
      }
    } else {
      print('[异步] 文件 $asyncFilename 不存在，无法按行读取。');
    }
  } catch (e) {
    print('[异步] 按行读取时出错: $e');
  }

  // 5. 异步写入字节数据 (二进制文件)
  final binaryFile = File(binaryFilename);
  try {
    print('\n[异步] 准备写入字节数据到 $binaryFilename...');
    // 创建一些字节数据 (例如: 整数 1, 255, 和字符串 "Hi" 的 UTF8 编码)
    final builder = BytesBuilder();
    builder.addByte(1); // 添加一个字节
    builder.addByte(255);
    builder.add(utf8.encode("Hi")); // 添加字符串的 UTF8 编码字节
    final bytesToWrite = builder.toBytes(); // 获取 Uint8List
    print('  要写入的字节: $bytesToWrite');
    await binaryFile.writeAsBytes(bytesToWrite, mode: FileMode.write);
    print('[异步] 字节数据写入成功。');
  } catch (e) {
    print('[异步] 写入字节时出错: $e');
  }

  // 6. 异步读取字节数据
  try {
    if (await binaryFile.exists()) {
      print('\n[异步] 准备读取字节数据从 $binaryFilename...');
      final bytesRead = await binaryFile.readAsBytes();
      print('[异步] 读取到的字节数据: $bytesRead');
      // 你可以根据需要解析这些字节
      // 例如，前两个字节是 1 和 255，后面是 "Hi" 的 UTF8 编码 [72, 105]
      if (bytesRead.length >= 4) {
        print(
          '  解析示例: 第一个字节=${bytesRead[0]}, 第二个字节=${bytesRead[1]}, 后续字符串="${utf8.decode(bytesRead.sublist(2))}"',
        );
      }
    } else {
      print('[异步] 文件 $binaryFilename 不存在，无法读取字节。');
    }
  } catch (e) {
    print('[异步] 读取字节时出错: $e');
  }

  // --- 同步操作 (仅在特定场景下使用，避免在 UI 线程或服务器中使用) ---
  print('\n--- 同步文件操作 ---');
  final syncFile = File(syncFilename);

  // 1. 同步写入字符串 (覆盖)
  try {
    print('\n[同步] 准备写入字符串到 $syncFilename (覆盖)...');
    final syncContent = '这是同步写入的日志。\n时间: ${DateTime.now()}';
    // 同步写入会阻塞当前线程
    syncFile.writeAsStringSync(
      syncContent,
      encoding: utf8,
      mode: FileMode.write,
    );
    print('[同步] 字符串写入成功。');
  } catch (e) {
    print('[同步] 写入字符串时出错: $e');
  }

  // 2. 同步读取字符串
  try {
    if (syncFile.existsSync()) {
      // 同步检查文件是否存在
      print('\n[同步] 准备读取文件 $syncFilename 为字符串...');
      final syncFileContent = syncFile.readAsStringSync(encoding: utf8);
      print('[同步] 文件内容:\n"""\n$syncFileContent"""');
    } else {
      print('[同步] 文件 $syncFilename 不存在，无法读取。');
    }
  } catch (e) {
    print('[同步] 读取字符串时出错: $e');
  }

  // --- 清理操作 ---
  print('\n--- 清理创建的文件 ---');
  try {
    if (await asyncFile.exists()) {
      await asyncFile.delete();
      print('已删除文件: $asyncFilename');
    }
    if (await binaryFile.exists()) {
      await binaryFile.delete();
      print('已删除文件: $binaryFilename');
    }
    if (syncFile.existsSync()) {
      syncFile.deleteSync(); // 同步删除
      print('已删除文件: $syncFilename');
    }
  } catch (e) {
    print('删除文件时出错: $e');
  }

  print('\n文件读写演示完成。');
}
